package com.hyjr.common.utils;

import java.io.IOException;
import java.util.Arrays;
import java.util.Map;

import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;

import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;
import com.google.gson.GsonBuilder;

/**
 * gosn 封装处理类
 * 
 * @author huhuamin
 * 
 * @version V1.0 2015-6-3
 * 
 */
public class JsonUtil {
	/* 日期默认的序列化格式 */
	private static String default_dateFormat = "yyyy-MM-dd";
	/* 对于字段值为null的属性默认进行序列化 */
	private static boolean default_serializeNulls = true;
	/* 默认以漂亮的格式进行打印 */
	private static boolean default_prettyPrint = true;

	/**
	 * 将对象转换为JSON字符串
	 * 
	 * @param param
	 * @return
	 */
	public static String toJson(Object param) {
		return toJson(param, null, default_serializeNulls, default_dateFormat, default_prettyPrint);
	}

	/**
	 * 
	 * @param param
	 *            需要转换成json字符串的对象
	 * @param excludeProperties
	 *            不需要进行序列化的字段的名称
	 * @return
	 */
	public static String toJson(Object param, String[] excludeProperties) {
		return toJson(param, excludeProperties, default_serializeNulls, default_dateFormat, default_prettyPrint);
	}

	/**
	 * 
	 * @param param
	 *            需要转换成json字符串的对象
	 * @param dateFormat
	 *            日期类型序列化的格式
	 * @return
	 */
	public static String toJson(Object param, String dateFormat) {
		return toJson(param, null, default_serializeNulls, dateFormat, default_prettyPrint);
	}

	/**
	 * 
	 * @param param
	 *            需要转换成json字符串的对象
	 * @param excludeProperties
	 *            不需要进行序列化的字段的名称
	 * @param dateFormat
	 *            日期类型序列化的格式
	 * @return
	 */
	public static String toJson(Object param, String[] excludeProperties, String dateFormat) {
		return toJson(param, excludeProperties, default_serializeNulls, dateFormat, default_prettyPrint);
	}

	/**
	 * 
	 * @param param
	 *            需要转换成json字符串的对象
	 * @param excludeProperties
	 *            不需要进行序列化的字段的名称
	 * @param serializeNulls
	 *            对于值为null的字段是否需要进行序列化
	 * @param dateFormat
	 *            日期类型序列化的格式
	 * @return
	 */
	public static String toJson(Object param, String[] excludeProperties, boolean serializeNulls, String dateFormat) {
		return toJson(param, excludeProperties, serializeNulls, dateFormat, default_prettyPrint);
	}

	/**
	 * 
	 * @param param
	 *            需要转换成json字符串的对象
	 * @param excludeProperties
	 *            不需要进行序列化的字段的名称
	 * @param serializeNulls
	 *            对于值为null的字段是否需要进行序列化
	 * @param dateFormat
	 *            日期类型序列化的格式
	 * @param prettyPrint
	 *            是否以"漂亮的格式"进行打印，设置为false,打印结果会在一行
	 * @return
	 */
	public static String toJson(Object param, final String[] excludeProperties, boolean serializeNulls, String dateFormat, boolean prettyPrint) {
		if (param == null) {
			return null;
		}
		GsonBuilder gsonBuilder = new GsonBuilder().setDateFormat(dateFormat);
		if (excludeProperties != null && excludeProperties.length > 0) {
			gsonBuilder.setExclusionStrategies(new ExclusionStrategy() {

				public boolean shouldSkipField(FieldAttributes f) {
					return Arrays.asList(excludeProperties).contains(f.getName());
				}

				public boolean shouldSkipClass(Class<?> clazz) {
					return false;
				}
			});
		}
		if (serializeNulls) {
			gsonBuilder.setPrettyPrinting();
			gsonBuilder.serializeNulls();
		}
		if (prettyPrint) {
			gsonBuilder.setPrettyPrinting();
		}
		return gsonBuilder.create().toJson(param);
	}

	/**
	 * 获取默认情况下日期的序列化格式
	 * 
	 * @return
	 */
	public static String getDefaultDateFormat() {
		return default_dateFormat;
	}

	/**
	 * 设置json序列化时，默认的日期格式
	 * 
	 * @param dateFormat
	 */
	public static void setDefaultDateFormat(String dateFormat) {
		default_dateFormat = dateFormat;
	}

	/**
	 * 获取默认情况下，对于值为null的字段是否进行序列化
	 * 
	 * @return
	 */
	public static boolean getDefaultSerializeNulls() {
		return default_serializeNulls;
	}

	/**
	 * 设置默认情况下，对于值为null的字段，是否需要序列化
	 * 
	 * @return
	 */
	public static void setDefaultSerializeNulls(boolean flag) {
		default_serializeNulls = flag;
	}

	public static boolean getDefaultPrettyPrint() {
		return default_prettyPrint;
	}

	public static void setDefaultPrettyPrint(boolean flag) {
		default_prettyPrint = flag;
	}
	
	public static String getJsonData(Map orgMap) {
		ObjectMapper mapper = new ObjectMapper();
		try {
			return mapper.writeValueAsString(orgMap);
		} catch (JsonParseException e) {
			e.printStackTrace();

		} catch (JsonMappingException e) {
			e.printStackTrace();

		} catch (IOException e) {
			e.printStackTrace();

		}
		return null;
	}
}
